/**
 * this 精髓：谁调用的函数this就指向谁。
 */

//情况1：构造函数中this的指向(作为构造函数来用函数名大写，规范)——>实例化后的对象

function A() {
    this.name = 'hello';
    this.age = 12;
    console.log(this);
}

var a = new A();
console.log(a.name);

//情况1.1：直接调用函数,this的指向——>window

A();

//情况1.2：原型中this的指向.——>实例化后的对象。

A.prototype.test = 'this=new object';

console.log(a.test);

//情况2：函数作为对象的属性，此时this的指向——>实例化后的对象

var b = {
    name: 'hello',
    B: function () {
        console.log(this);
        console.log(this.name);
    }
};

b.B();

//情况2.1,拿出该对象的属性，单独执行 this =window ,this.name = undefined

var Bb = b.B;
Bb();


//情况三、函数用call\apply 调用  ———>函数中this的值就是call\apply传入的对象。

var obj = {test: 'obj'};
A.call(obj);

//情况四、全局函数、普通函数 this作用域=window

console.log("-------------------------");

//情况五、函数作为对象的属性，属性中嵌套函数

var obj5 = {
    name1: 'hello',
    fa: function () {
        console.log(this.name1);    //'hello'

        function a() {
            console.log(this.name1);    //undefined
        }

        a();
    }
};
obj5.fa();


